//! # `std::net::SocketAddr` 示例
//!
//! `SocketAddr` 是一个结构体，表示一个套接字地址，包含一个 IP 地址和一个端口号。

use std::net::{IpAddr, Ipv4Addr, SocketAddr};

/// ## `SocketAddr::new`
///
/// 创建一个新的套接字地址。
pub fn socket_addr_new_example() {
    let socket_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)), 8080);
    println!("套接字地址: {}", socket_addr);
    assert_eq!(socket_addr.ip(), IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)));
    assert_eq!(socket_addr.port(), 8080);
}

/// ## `ip` 和 `port`
///
/// 获取套接字地址的 IP 地址和端口号。
pub fn ip_port_example() {
    let socket_addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
    println!(
        "IP 地址: {}, 端口号: {}",
        socket_addr.ip(),
        socket_addr.port()
    );
    assert_eq!(socket_addr.ip(), IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)));
    assert_eq!(socket_addr.port(), 8080);
}

/// ## `is_ipv4` 和 `is_ipv6`
///
/// 判断套接字地址是 IPv4 还是 IPv6。
pub fn is_ipv4_ipv6_example() {
    let socket_addr_v4 = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
    let socket_addr_v6 = "[::1]:8080".parse::<SocketAddr>().unwrap();

    assert!(socket_addr_v4.is_ipv4());
    assert!(!socket_addr_v4.is_ipv6());
    assert!(socket_addr_v6.is_ipv6());
    assert!(!socket_addr_v6.is_ipv4());
}
